﻿using System;
using System.Linq;
using System.Collections.Generic;
using System.Text;
using System.Data.SQLite;
using System.Data;
using ServirMovil.ServicioWS;
using ServirMovil.Herramientas;

namespace ServirMovil.Clases.Datos
{
    /// <summary>
    /// <para>Clase       : InventarioDA</para>  
    /// <para>Descripcion : Contiene la logica de acceso a datos del Inventario</para> 
    /// <para>Autor       : Pedro Miguel Vera Rafael (pedro.verarafael@gmail.com)</para> 
    /// <para>Fecha       : 15/01/2013</para> 
    /// <para>Empresa     : GS1 Peru</para> 
    /// </summary>
    /// <remarks>
    /// </remarks>
    /// <history>
    /// 	[Pedro Miguel Vera Rafael]	15/01/2013	Created
    /// </history>
    public class InventarioDA:DataBaseLite
    {
        #region --- Constantes ---
        private const string CODINVENTARIO = "CODINVENTARIO";
        private const string CODSEDE = "CODSEDE";
        private const string CODUSUARIO = "CODUSUARIO";
        private const string FECHAREGISTRO = "FECHAREGISTRO";
        private const string EPC = "EPC";
        #endregion

        #region --- Metodos DAO ---
        public bool iniciarInventario(Inventario inventario)
        {
            StringBuilder sentenciaSQL = null;

            sentenciaSQL = new StringBuilder();
            sentenciaSQL.Append("INSERT INTO INVENTARIO (");
            sentenciaSQL.Append("CODINVENTARIO, CODSEDE, FECHAREGISTRO) ");
            sentenciaSQL.Append("VALUES(?, ?, ?)");

            using (this.comando = new SQLiteCommand())
            {
                this.comando.Connection = conectarBD();
                this.comando.CommandText = sentenciaSQL.ToString();
                this.comando.CommandType = CommandType.Text;

                this.comando.Parameters.Add(CODINVENTARIO, DbType.Int32).Value = inventario.codInventario;
                this.comando.Parameters.Add(CODSEDE, DbType.Int32).Value = inventario.sede.codigo;
                this.comando.Parameters.Add(FECHAREGISTRO, DbType.String).Value = DateTime.Now.ToString(Constantes.FORMATO_FECHAHORA_TR);

                return this.comando.ExecuteNonQuery() > 0;
            }
        }

        public Inventario obtenerInventario(Inventario inventario)
        {
            Inventario inventarioEnviar = null;
            StringBuilder sentenciaSQL = null;

            sentenciaSQL = new StringBuilder();
            sentenciaSQL.Append("SELECT CODINVENTARIO, CODSEDE, FECHAREGISTRO ");
            sentenciaSQL.Append("FROM INVENTARIO ");
            sentenciaSQL.Append("WHERE CODSEDE = " + inventario.sede.codigo.ToString());

            using (this.comando = new SQLiteCommand())
            {
                this.comando.Connection = conectarBD();
                this.comando.CommandText = sentenciaSQL.ToString();
                this.comando.CommandType = CommandType.Text;

                using (SQLiteDataReader dr = this.comando.ExecuteReader())
                {
                    while (dr.Read())
                    {
                        inventarioEnviar = generarEntidadInventario(dr);
                    }
                }
            }

            return inventarioEnviar;
        }

        public List<String> obtenerDetInventario(Inventario inventario)
        {
            List<String> listaEpc = null;
            StringBuilder sentenciaSQL = null;

            sentenciaSQL = new StringBuilder();
            sentenciaSQL.Append("SELECT EPC ");
            sentenciaSQL.Append("FROM DET_INVENTARIO ");
            sentenciaSQL.Append("WHERE CODSEDE = " + inventario.sede.codigo.ToString());

            using (this.comando = new SQLiteCommand())
            {
                this.comando.Connection = conectarBD();
                this.comando.CommandText = sentenciaSQL.ToString();
                this.comando.CommandType = CommandType.Text;

                listaEpc = new List<string>();

                using (SQLiteDataReader dr = this.comando.ExecuteReader())
                {
                    while (dr.Read())
                    {
                        listaEpc.Add(dr[EPC].ToString());
                    }
                }
            }

            return listaEpc;
        }

        public bool cerrarInventario(Inventario inventario)
        {
            StringBuilder sentenciaSQL = null;

            sentenciaSQL = new StringBuilder();
            sentenciaSQL.Append("DELETE FROM INVENTARIO ");
            sentenciaSQL.Append("WHERE CODINVENTARIO = " + inventario.codInventario.ToString() + "; ");

            sentenciaSQL.Append("DELETE FROM DET_INVENTARIO ");
            sentenciaSQL.Append("WHERE CODINVENTARIO = " + inventario.codInventario.ToString() +"; ");

            using (this.comando = new SQLiteCommand())
            {
                this.comando.Connection = conectarBD();
                this.comando.CommandText = sentenciaSQL.ToString();
                this.comando.CommandType = CommandType.Text;

                return this.comando.ExecuteNonQuery() > 0;
            }
        }

        public bool registrarDetInventario(Inventario inventario, Etiqueta etiqueta)
        {
            StringBuilder sentenciaSQL = null;

            sentenciaSQL = new StringBuilder();
            sentenciaSQL.Append("INSERT INTO DET_INVENTARIO ( ");
            sentenciaSQL.Append("CODINVENTARIO, CODSEDE, CODUSUARIO, EPC, FECHAREGISTRO) ");
            sentenciaSQL.Append("VALUES(?, ?, ?, ?, ?)");

            using (this.comando = new SQLiteCommand())
            {
                this.comando.Connection = conectarBD();
                this.comando.CommandText = sentenciaSQL.ToString();
                this.comando.CommandType = CommandType.Text;

                this.comando.Parameters.Add(CODINVENTARIO, DbType.Int32).Value = inventario.codInventario;
                this.comando.Parameters.Add(CODSEDE, DbType.Int32).Value = inventario.sede.codigo;
                this.comando.Parameters.Add(CODUSUARIO, DbType.Int32).Value = inventario.usuario.idUsuario;
                this.comando.Parameters.Add(EPC, DbType.String).Value = etiqueta.epc;
                this.comando.Parameters.Add(FECHAREGISTRO, DbType.String).Value = DateTime.Now.ToString(Constantes.FORMATO_FECHAHORA_TR);

                return this.comando.ExecuteNonQuery() > 0;
            }
        }

        private Inventario generarEntidadInventario(SQLiteDataReader dr)
        {
            Inventario inventario = new Inventario();
            inventario.codInventario = Convert.ToInt32(dr[CODINVENTARIO]);

            inventario.sede = new Sede();
            inventario.sede.codigo = Convert.ToInt32(dr[CODSEDE]);

            return inventario;
        }

        public List<String> obtenerDetInventarioProceso(Inventario inventario)
        {
            List<String> listaEpc = null;
            StringBuilder sentenciaSQL = null;

            sentenciaSQL = new StringBuilder();
            sentenciaSQL.Append("SELECT EPC ");
            sentenciaSQL.Append("FROM DET_INVENTARIO ");
            sentenciaSQL.Append("WHERE CODSEDE = " + inventario.sede.codigo.ToString());
            sentenciaSQL.Append(" AND INDPROCESADO = 'N'");

            using (this.comando = new SQLiteCommand())
            {
                this.comando.Connection = conectarBD();
                this.comando.CommandText = sentenciaSQL.ToString();
                this.comando.CommandType = CommandType.Text;

                listaEpc = new List<string>();

                using (SQLiteDataReader dr = this.comando.ExecuteReader())
                {
                    while (dr.Read())
                    {
                        listaEpc.Add(dr[EPC].ToString());
                    }
                }
            }

            return listaEpc;
        }

        public bool actualizarDetInventarioProceso(Inventario inventario, Etiqueta etiqueta)
        {
            StringBuilder sentenciaSQL = null;

            sentenciaSQL = new StringBuilder();
            sentenciaSQL.Append("UPDATE DET_INVENTARIO ");
            sentenciaSQL.Append(" SET INDPROCESADO = 'S' ");
            sentenciaSQL.Append(" WHERE EPC = '" + etiqueta.epc +"'");
            

            using (this.comando = new SQLiteCommand())
            {
                this.comando.Connection = conectarBD();
                this.comando.CommandText = sentenciaSQL.ToString();
                this.comando.CommandType = CommandType.Text;
                
                return this.comando.ExecuteNonQuery() > 0;
            }
        }

        #endregion
    }
}
